package framework;

import static org.testng.AssertJUnit.assertTrue;

import org.testng.Reporter;

/**
 * Абстрактная базовая сущность, от которой наследуются все основные объекты 
 * фреймворка - "базовая форма", "базовый тест" и "базовый GUI элемент"
 * Используется для логирования, хранения ссылки на браузер и
 * некоторых общих функций
 */
public abstract class BaseEntity {

    private Logger logger = Logger.getInstance();
    public static Browser browser = Browser.getInstance();
    protected static boolean isLogged = false;
    //=====================================================================
    // Методы для поддержки логирования

    /**
     * Метод используется для вывода в лог названия элемента 
     * перед самим сообщением
     * Например, Форма 'Логин' | Форма открыта,
     * Поле ввода 'Логин' | Вводим значение 'admin'
     */
    protected abstract String formatLogMsg(String message);

    protected void debug(String message) {
        logger.debug(String.format(
                "[%1$s] %2$s", 
                    this.getClass().getSimpleName(), 
                    formatLogMsg(message)));
    }

    protected void info(String message) {
        logger.info(formatLogMsg(message));
        Reporter.log("<br>");
    }

    protected void warn(String message) {
        logger.warn(formatLogMsg(message));
        Reporter.log("<br>");
    }

    protected void error(String message) {
        logger.error(formatLogMsg(message));
        Reporter.log("<br>");
    }

    protected void testName(String message) {
        logger.testName(message);
    }

    protected void step(int step, String message) {
        logger.step(step, message);
    }

    protected void fatal(String message) {
        logger.fatal(formatLogMsg(message));
        Reporter.log("<br>");
        assertTrue(formatLogMsg(message), false);
        //Kill browser here
        Browser.getInstance().exit();
    }

    //====================================================================
    // Ассерты

    public void doAssert(Boolean isTrue, String passMsg, String failMsg) {
        if (isTrue) {
            info(passMsg);
        } else {
            fatal(failMsg);
        }
    }

}
